//#region
///* Adoor.NET - Object/Relational mapping framework leveraging ADO.NET`s powerful disconnected mode.
// * 
// * This library is free software; you can redistribute it and/or
// * modify it under the terms of the GNU Lesser General Public
// * License as published by the Free Software Foundation; either
// * version 2.1 of the License, or (at your option) any later version.
// *  
// * This library is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// * Lesser General Public License for more details.
// *  
// * You should have received a copy of the GNU Lesser General Public
// * License along with this library; if not, write to the Free Software
// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
// */ 
//#endregion

//using System;
//using System.Collections.Generic;
//using System.Data;
//using System.Text;
//using Adoor.Expression;

//namespace Adoor.Relational.SqlDriver
//{
//    /// <summary>
//    /// Summary description for MySqlDriver.
//    /// </summary>
//    public class MySqlDriver : CommonSqlDriver
//    {
//        public MySqlDriver() : this(0)
//        {
//        }

//        public MySqlDriver(int paramCount): base(paramCount)
//        {
//        }

//        protected override CommonSqlDriver Clone()
//        {
//            return new TransactSqlDriver(this.paramCount);
//        }

//        public static string EscapeMySql(string name)
//        {
//            return string.Concat("`", name, "`");
//        }

//        protected override string Escape(string name)
//        {
//            return EscapeMySql(name);
//        }

//        protected override void EvaluateCross(CrossOperator j)
//        {
//            this.Result = new StringBuilder(this.mode == SqlMode.Aggregate ? "" : "SELECT");
			
//            if (this.distinct)
//                this.Result.Append(" DISTINCT");

//            if (this.mode == SqlMode.Select)
//            {
//                this.Result.Append(' ');
//                string cc = "";

//                if (this.columns != null)
//                {
//                    foreach(SelectExpression c in this.columns)
//                    {
//                        if (cc != "")
//                            cc += ",";
//                        cc += GenerateExpression(c.Expr) + " " + Escape(c.Alias);
//                    }
//                }
//                else 
//                {
//                    foreach(ExpressionName c in j.Columns)
//                    {
//                        if (cc != "")
//                            cc += ",";
//                        cc += FullName(c);
//                    }
//                }
//                if (cc == "")
//                    this.Result.Append('1');
//                else
//                    this.Result.Append(cc);
//            }

//            this.Result.Append(" FROM ");

//            CommonInternalDriver driver2 = CreateInternalDriver();

//            driver2.Evaluate(j.Source1, "");
//            this.Result.Append(driver2.Result);
//            this.Result.Append(", ");

//            string cond1 = driver2.Condition;

//            driver2.Evaluate(j.Source2, j.Alias);
//            this.Result.Append(driver2.Result);
//            string cond2 = driver2.Condition;
//            if (cond2 != "")
//            {
//                if (cond1 != "")
//                    cond1 += " AND ";
//                cond1 += cond2;
//            }

//            if (this.filter != "") 
//            {
//                if (cond1 != "")
//                    cond1 += " AND ";
//                cond1 += this.filter;
//            }
//            if (cond1 != "")
//            {
//                this.Result.Append(" WHERE ");
//                this.Result.Append(cond1);
//            }

//            if (sort != null)
//            {
//                this.Result.Append(" ORDER BY ");
//                for (int i = 0; i < sort.Length; i++)
//                {
//                    if (i != 0)
//                        this.Result.Append(", ");
//                    this.Result.Append(GenerateExpression(sort[i].Expr));
//                    if (sort[i].SortType == ScannerToken.Desc)
//                        this.Result.Append(" DESC");
//                }
//            }
//            this.sort = null;

//            if (this.top != Int64.MaxValue)
//            {
//                this.Result.Append(" LIMIT ");
//                this.Result.Append(this.top);
//            }
//        }

//        protected override void EvaluateJoin(JoinOperator j)
//        {
//            this.Result = new StringBuilder(this.mode == SqlMode.Aggregate ? "" : "select");
			
//            if (this.distinct)
//                this.Result.Append(" distinct");

//            if (this.mode == SqlMode.Select)
//            {
//                this.Result.Append(' ');
//                string cc = "";

//                if (this.columns != null)
//                {
//                    foreach(SelectExpression c in this.columns)
//                    {
//                        if (cc != "")
//                            cc += ",";
//                        cc += GenerateExpression(c.Expr) + " " + Escape(c.Alias);
//                    }
//                }
//                else
//                {
//                    foreach(ExpressionName c in j.Columns)
//                    {
//                        if (cc != "")
//                            cc += ",";
//                        cc += FullName(c);
//                    }
//                }
//                if (cc == "")
//                    this.Result.Append('1');
//                else
//                    this.Result.Append(cc);
//            }

//            this.Result.Append(" from ");

//            CommonInternalDriver driver2 = CreateInternalDriver();

//            driver2.Evaluate(j.Source1, j.Correlation);
//            this.Result.Append(driver2.Result);
//            this.Result.Append(j.IsOuterJoin ? " left outer join " : " join ");

//            string cond1 = driver2.Condition;

//            driver2.Evaluate(j.Source2, j.Alias);
//            this.Result.Append(driver2.Result);
//            string cond2 = driver2.Condition;
//            if (cond2 != "")
//            {
//                if (cond1 != "")
//                    cond1 += " and ";
//                cond1 += cond2;
//            }
//            this.Result.Append(" on ");
//            this.Result.Append(Escape(j.Alias));
//            this.Result.Append('.');
//            this.Result.Append(Escape(j.Column2));
//            this.Result.Append(" = ");
//            this.Result.Append(Escape(j.Correlation));
//            this.Result.Append('.');
//            this.Result.Append(Escape(j.Column1));

//            if (cond1 != "")
//            {
//                this.Result.Append(" and ");
//                this.Result.Append(cond1);
//            }
//            if (this.filter != "") 
//            {
//                if (j.IsOuterJoin)
//                    this.Result.Append(" wher ");
//                else
//                    this.Result.Append(" and ");
//                this.Result.Append(this.filter);
//            }

//            if (sort != null)
//            {
//                this.Result.Append(" order by ");
//                for (int i = 0; i < sort.Length; i++)
//                {
//                    if (i != 0)
//                        this.Result.Append(", ");
//                    this.Result.Append(GenerateExpression(sort[i].Expr));
//                    if (sort[i].SortType == ScannerToken.Desc)
//                        this.Result.Append(" desc");
//                }
//            }
//            this.sort = null;

//            if (this.top != Int64.MaxValue)
//            {
//                this.Result.Append(" limit ");
//                this.Result.Append(this.top);
//            }
//        }
		
//        protected override void EvaluateScan(ScanQuery s)
//        {
//            if (this.mode == SqlMode.Delete)
//                this.Result = new StringBuilder("DELETE");
//            else 
//            {
//                this.Result = new StringBuilder(this.mode == SqlMode.Aggregate ? "" : "SELECT");				
//                if (this.distinct)
//                    this.Result.Append(" DISTINCT");
//                if (this.mode == SqlMode.Select)
//                {
//                    this.Result.Append(' ');
//                    StringBuilder cc = new StringBuilder();
//                    if (this.columns != null)
//                    {
//                        foreach(ExpressionName c in this.columns)
//                        {
//                            if (cc.Length != 0)
//                                cc.Append(',');
//                            cc.Append(GenerateExpression(c));
//                            cc.Append(" ");
//                            cc.Append(Escape(c.Value));
//                        }
//                    }
//                    else
//                    {
//                        foreach(DataColumn dc in s.DataColumns)
//                        {
//                            if (cc.Length != 0)
//                                cc.Append(',');
//                            cc.Append(Escape(dc.ColumnName));
//                        }
//                    }
//                    if (cc.Length == 0)
//                        this.Result.Append("1");
//                    else
//                        this.Result.Append(cc);
//                }
//            }
//            string tableName = TableName(s.SourceName);
//            this.Result.Append(" FROM ");
//            this.Result.Append(Escape(tableName));
//            if (this.alias != "" && mode != SqlMode.Delete)
//            {
//                //result += " AS " + Escape(this.alias);
//                this.Result.Append(' ');
//                this.Result.Append(Escape(this.alias));
//            }
//            if (this.alias == "")
//                this.alias = tableName;
//            if (filter != "")
//            {
//                this.Result.Append(" WHERE ");
//                this.Result.Append(filter);
//            }
//            if (sort != null)
//            {
//                this.Result.Append(" ORDER BY ");
//                for (int i = 0; i < sort.Length; i++)
//                {
//                    if (i != 0)
//                        this.Result.Append(", ");
//                    this.Result.Append(GenerateExpression(sort[i].Expr));
//                    if (sort[i].SortType == ScannerToken.Desc)
//                        this.Result.Append(" DESC");
//                }
//            }
//            this.sort = null;
//            if (this.top != Int64.MaxValue)
//            {
//                this.Result.Append(" LIMIT ");
//                this.Result.Append(this.top);
//            }
//        }

//        protected override void Evaluate(SqlMode mode, RelationalQuery query, ICollection<Adoor.Expression.SelectExpression> columns, SortExpression[] sort, Int64 top, string filter
//            , GroupByExpression[] groupBy, HavingExpression having, out string[] results)
//        {
//            base.Evaluate(mode, query, columns, sort, top, filter, groupBy, having, out results);
//            for(int i = 0; i<results.Length; i++)
//            {
//                results[i] = results[i].Replace("[", "").Replace("]", "");  // TODO: check if still needed				
//            }			
//        }

//        protected override string GenerateExpression(ExpressionNode en)
//        {
//            return MySqlExpressionStringizer.Evaluate(this, en);
//        }

//        class MySqlExpressionStringizer: CommonExpressionStringizer
//        {
//            public new static string Evaluate(MySqlDriver driver, ExpressionNode n)
//            {
//                MySqlExpressionStringizer es = new MySqlExpressionStringizer(driver);
//                n.Accept(es);
//                return es.Result.ToString();
//            }

//            protected MySqlExpressionStringizer(MySqlDriver driver)
//                : base(driver)
//            {
//            }

//            public override void VisitName(ExpressionName n)
//            {
//                if (n.Qualifier != "") 
//                {
//                    this.Result.Append(MySqlDriver.EscapeMySql(n.Qualifier));
//                    this.Result.Append('.');
//                    this.Result.Append(n.Value);
//                    return;
//                }
//                this.Result.Append(n.Value);
//            }
//        }
//    }
//}
